interface Array<T> {
  myFlat(depth?: number): any[];
}
// 方法1
// Array.prototype.myFlat = function (depth=1) {
//   const flat = (arr,level) => {
//     let result=[]
//     if (level >= depth) {
//       return arr
//     }
//     for (let i = 0; i < arr.length; i++){
//       result = result.concat(Array.isArray(arr[i])?flat(arr[i],level+1):arr[i])
//     }
//     return result
//   }
//   return flat(this,0)
// };
// 方法2
Array.prototype.myFlat = function (depth = 1) {
  const flat = (arr, level) => {
    if (level >= depth) {
      return arr;
    }
    return arr.reduce((pre, next) => {
      return pre.concat(Array.isArray(next) ? flat(next, level + 1) : next);
    }, []);
  };
  return flat(this, 0);
};
// 方法3
// Array.prototype.myFlat = function () {
//   const flat = (arr) => {
//     let str = JSON.stringify(arr);
//     str = str.replace(/(\[|\])/g, '');
//     return JSON.parse('[' + str + ']');
//   };
//   return flat(this);
// };

// 方法4

const arr = [1, 2, [3, 4, [5, 6, [8, 9]]], 7];
// const result = arr.flat(Infinity)
const result = arr.myFlat(Infinity);
console.log('result ==> ', result);
